博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python基础(二十五)
阅读量:4550 次
发布时间:2019-06-08

本文共 7622 字,大约阅读时间需要 25 分钟。

一、组合搜索表

第一种:最简单的方式

models.py里面的设置:

from django.db import models# Create your models here.class Category(models.Model):  #创建一个标签表    caption = models.CharField(max_length=16)# class ArticleType(models.Model): #文章类型分类表动态的就要搞表#     caption = models.CharField(max_length=16)class Article(models.Model):创建一个标题和内容表    title = models.CharField(max_length=32)    content = models.CharField(max_length=255)        category = models.ForeignKey(Category)  #建立外键约束    article_type = models.ForeignKey(ArticleType)

urls.py里面的设置:

from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [     url(r'^article/',views.article),]

app01/views.py里面的设置:

from django.shortcuts import renderfrom app01 import modelsdef article(request):    result = models.Article.objects.all()    return  render(request,'article.html',{
'result':result})

article.html里面的设置:

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}

查看结果(下面的数据需要提前去表里面创建一些好看效果):

第二种:我们让内容显示的更多一点

app01/views.py里面的设置:

from django.shortcuts import renderfrom app01 import modelsdef article(request,*args,**kwargs):    article_type_list = models.ArticleType.objects.all()    category_list = models.Category.objects.all()    result = models.Article.objects.all()    return  render(        request,        'article.html',        {            'result':result,            'article_type_list':article_type_list,            'category_list':category_list        })

article.html里面的设置:

    
Title

过滤条件

{
% for row in article_type_list %}
{
{ row.caption }}
{
% endfor %}
{
% for row in category_list %}
{
{ row.caption }}
{
% endfor %}

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}

查看结果:

 

第三种:点击不同的过滤条件,url发生对应的跳转,并有颜色显示:

app01/views.py里面的设置:

from django.shortcuts import render# Create your views here.from app01 import modelsfrom django.urls import  reversedef article(request,*args,**kwargs):    print(kwargs)    condition = {}    for k,v in kwargs.items():        kwargs[k] = int(v)        if v == '0':            pass        else:            condition[k] = v    article_type_list = models.ArticleType.objects.all()    category_list = models.Category.objects.all()    result = models.Article.objects.filter(**condition)    return  render(        request,        'article.html',        {            'result':result,            'article_type_list':article_type_list,            'category_list':category_list,            'arg_dict':kwargs        })
View Code

article.html里面的设置:

    
Title

过滤条件

{
% if arg_dict.article_type_id == 0 %}
全部 {
% else %}
全部 {
% endif %} {
% for row in article_type_list %} {
% if row.id == arg_dict.article_type_id %}
{
{ row.caption }}
{
% else %}
{
{ row.caption }}
{
% endif %} {
% endfor %}
{
% if arg_dict.category_id == 0 %}
全部 {
% else %}
全部 {
% endif %} {
% for row in category_list %} {
% if row.id == arg_dict.category_id %}
{
{ row.caption }}
{
% else %}
{
{ row.caption }}
{
% endif %} {
% endfor %}

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}
View Code

显示结果:

 

第四种:通过函数实现,前端html页面不用写那么多代码:

app01/templatetags/filter.py的设置

 

from django import templatefrom django.utils.safestring import mark_saferegister = template.Library()@register.simple_tagdef filter_all(arg_dict,k):    if k == 'article_type_id':        n1 = arg_dict['article_type_id']        n2 = arg_dict['category_id']        if n1 == 0:            ret = '全部' % n2        else:            ret = '全部' % n2    else:        n1 = arg_dict['category_id']        n2 = arg_dict['article_type_id']        if n1 == 0:            ret = '全部' % n2        else:            ret = '全部' % n2    return mark_safe(ret)@register.simple_tagdef filter_article_type(article_type_list,arg_dict):    ret = []    for row in article_type_list:        if row.id == arg_dict['article_type_id']:            temp = '%s' %(row.id,arg_dict['category_id'],row.caption,)        else:            temp = '%s' %(row.id,arg_dict['category_id'],row.caption,)        ret.append(temp)    return  mark_safe(''.join(ret))@register.simple_tagdef filter_category_type(category_list,arg_dict):    ret = []    for row in category_list:        if row.id == arg_dict['category_id']:            temp = '%s' %(arg_dict['article_type_id'],row.id,row.caption,)        else:            temp = '%s' %(arg_dict['article_type_id'],row.id,row.caption,)        ret.append(temp)    return  mark_safe(''.join(ret))
View Code

 

article.html的页面设置:

{% load filter %}    

过滤条件

{
% filter_all arg_dict 'article_type_id' %} {
% filter_article_type article_type_list arg_dict %}
{
% filter_all arg_dict 'category_id' %} {
% filter_category_type category_list arg_dict %}

查询结果

    {
    % for row in result %}
  • {
    { row.id }}-{
    { row.title }}
  • {
    % endfor %}
View Code

查看结果:

 

二、JSONP:

jsonp是一种请求方式,用来解决一些棘手的问题。

先要提一下下面的get方式:

Import requests

request.get(‘http://www.baidu.com’)  #往百度发一个get请求

request.post(‘http://www.baidu.com’)  #往百度发一个post请求

下面是使用方式:

import  requestsdef req(request):    response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301')    print(response.text)  #所有的文本内容    print(response.cookies)  #所有的cookies    print(response.headers)  #所有的响应头

 

下面是一个request.get的例子:

 urls.py的设置

from app02 import  views as a2urlpatterns = [    url(r'^req/',a2.req),]

app02/views设置:

import  requestsdef req(request):    response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301')    response.encoding = 'utf-8' #表示让字节用utf8编码编成字符串    #print(response.content) #字节类型    print(response.text)  #字符串类型的    return  render(request,'req.html',{
'result':response.text})

html页面req.html设置:

   {
{ result }}

结果显示:

 

现在这种模式是用户浏览器发送数据到我们的服务器端,然后服务器端再向天气服务器获取数据然后服务器端再把数据返回给浏览器。

 

第二个例子:我们用这个形式让浏览器直接向天气网站发请求获取数据:

下面是html里面的设置:

   

后台获取的结果

{
{ result }}

js直接获取结果

查看结果:

浏览器会出现下面的问题:

XMLHttpRequest cannot load http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access.

其实我们的请求已经发送到了Html页面里面设置的URL,但是浏览器具有同源策略,如果直接去别的域名去请求数据,浏览器直接就会拒绝掉返回的数据。

这时候我们就要解决浏览器阻止Ajax的请求,绕过去,浏览器无法阻止<script src='...'></script>,返回的数据必须是js格式。

并且jsonp只能发get请求。遵循统一规则callback。

 

第三个例子:

下面是正确的取值方式:

req.html:

   

后台获取的结果

{
{ result }}

js直接获取结果

View Code

查看结果:

第四个例子用jquery方式,这也是比较常用的方式:

查看结果:

转载于:https://www.cnblogs.com/chaishao/p/6437336.html

你可能感兴趣的文章
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
Ubuntu 14.04 更新源
查看>>
kafka生产者与消费者
查看>>
单元测试框架"艾信.NET单元测试工具(AssionUnit)"开发---第二步
查看>>
git 项目最常用命令总结
查看>>
[Arduino] 在串口读取多个字符串,并且转换为数字数组
查看>>
redis-window 集群配置
查看>>
4.1.6 Grundy数-硬币游戏2
查看>>
图像处理的软件
查看>>
Sql 2000系统表 语句查询表结构
查看>>